package com.lkc.util; // 定义包路径

// 导入阿里云OSS相关类
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.*;
// 导入Spring Web multipart文件处理类
import org.springframework.web.multipart.MultipartFile;

// 导入Java IO和工具类
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * ImageUtil类 - 阿里云OSS图片上传工具类
 */
public class ImageUtil {
    // OSS服务终端节点
    private static final String ENDPOINT = "oss-cn-beijing.aliyuncs.com";
    // OSS存储空间名称
    private static final String BUCKET_NAME = "liukc";
    // 访问密钥ID
    private static final String ACCESS_KEY_ID = "LTAI5tGqmtGtz5aGskfEqgZv";
    // 访问密钥Secret
    private static final String ACCESS_KEY_SECRET = "osW2CNIKXwfoouCbRODaZwXK2NHBiI";
    // OSS客户端实例（全局共享）
    private static final OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);

    /**
     * 上传文件到OSS
     * @param fileName 原始文件名
     * @param is 文件输入流
     * @return 文件访问URL
     */
    public static String upload(String fileName, InputStream is) {
        // 生成新的文件名（使用UUID避免重复）
        String newFileName = UUID.randomUUID().toString() + fileName.substring(fileName.lastIndexOf("."));
        // 创建新的OSS客户端实例
        OSS ossClient = new OSSClientBuilder().build("http://" + ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        try {
            // 创建上传请求对象
            PutObjectRequest request = new PutObjectRequest(BUCKET_NAME, newFileName, is);
            // 执行上传操作并获取结果
            PutObjectResult result = ossClient.putObject(request);
            // 返回文件访问URL
            return "https://" + BUCKET_NAME + "." + ENDPOINT + "/" + newFileName;
        } finally {
            // 确保关闭OSS客户端连接
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

    /**
     * 获取OSS存储空间中的文件列表
     * @return 文件名列表
     */
    public static List<String> getFlieList(){
        // 创建文件名列表
        List<String> list=new ArrayList<>();
        // 创建列出对象请求
        ListObjectsRequest request =new ListObjectsRequest(BUCKET_NAME);
        // 设置起始标记为null（从头开始）
        request.setMarker(null);
        // 设置最大返回对象数为1000
        request.setMaxKeys(1000);
        // 执行列出对象操作
        ObjectListing objectListing = ossClient.listObjects(request);
        // 遍历所有对象摘要信息
        for (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()){
            // 添加对象键（文件名）到列表中
            list.add(objectSummary.getKey());
        }
        // 返回文件名列表
        return list;
    }

    /**
     * 删除OSS中的单个文件
     * @param fileName 要删除的文件名
     */
    public static  void delete(String fileName){
        // 执行删除对象操作
        ossClient.deleteObject(BUCKET_NAME,fileName);
    }

    /**
     * 批量删除OSS中的文件
     * @param fileNameList 要删除的文件名列表
     */
    public static void deleteList(List<String> fileNameList){
        // 创建批量删除对象请求
        DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(BUCKET_NAME);
        // 设置要删除的对象键列表
        deleteObjectsRequest.setKeys(fileNameList);
        // 执行批量删除操作
        ossClient.deleteObjects(deleteObjectsRequest);
    }

    /**
     * 主方法 - 用于测试OSS操作
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 打印当前文件列表
        System.out.println(getFlieList());
        // 删除指定文件
        delete("0b909bf6-2e28-4daf-85ea-132306e552f5.png");
        // 打印删除后的文件列表
        System.out.println(getFlieList());
    }
}
